home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Devices / CDTool / cd.c next >
Encoding:
Text File  |  1990-09-14  |  5.9 KB  |  230 lines  |  [TEXT/MPS ]

  1. // imWare
  2. // Wednesday, February 14, 1990
  3. // James Beninghaus
  4.  
  5. #include    <ToolUtils.h>
  6. #include    <Memory.h>
  7. #include    <Errors.h>
  8. #include    <cd.h>
  9.  
  10. pascal    Byte Decimal2BCD(Byte n) {
  11.     return ((n / 10) << 4) + (n % 10); 
  12. }
  13.  
  14. pascal    Byte BCD2Decimal(Byte n) {
  15.     return ((n >> 4) * 10) + (n & 0x0f);
  16. }
  17.  
  18. pascal    OSErr OpenCD(Byte CDDrive, short *ioRefNum) {
  19.  
  20.     auto    OSErr            osErr;
  21.     auto    short            ioRefNumTemp,
  22.                             CDDriveCount,
  23.                             SCSIID;
  24.     static    WhoIsThereRec    *pb;
  25.  
  26.     pb = (WhoIsThereRec *) NewPtrClear(sizeof (*pb));
  27.     osErr = MemError();
  28.     if (0 != pb && noErr == osErr) {
  29.         osErr = OpenDriver("\p.AppleCD", &ioRefNumTemp);
  30.         if (noErr == osErr) {
  31.             (*pb).ioRefNum        = ioRefNumTemp;
  32.             (*pb).csCode        = csWhoIsThere;
  33.             osErr = PBStatus((ParmBlkPtr)pb, false);
  34.             if (noErr == osErr) {
  35.                 CDDriveCount = 0;
  36.                 for (SCSIID = 0; SCSIID < 7; ++SCSIID) {
  37.                     if (BitTst(&(*pb).csParam.SCSIMask, 7 - SCSIID)) {
  38.                         ++CDDriveCount;
  39.                         if (CDDrive == CDDriveCount) {
  40.                             *ioRefNum = -(32 + SCSIID) - 1;
  41.                             DisposPtr((Ptr) pb);
  42.                             return noErr;
  43.                         }
  44.                     }
  45.                 }
  46.                 osErr = paramErr;
  47.             }
  48.         }
  49.         DisposPtr((Ptr) pb);
  50.     }
  51.     return osErr;
  52. }
  53.  
  54. pascal    OSErr EjectCD(short ioRefNum) {
  55.  
  56.     auto    OSErr            osErr;
  57.     auto    Str255            ioName;
  58.     static    HVolumeParam    *pb;
  59.     
  60.     pb = (HVolumeParam *) NewPtrClear(sizeof (*pb));
  61.     osErr = MemError();
  62.     if (0 != pb && noErr == osErr) {
  63.         (*pb).ioNamePtr    = ioName;
  64.         (*pb).ioVolIndex = 0;
  65.         do {
  66.             ++(*pb).ioVolIndex;
  67.             osErr = PBHGetVInfo((HParmBlkPtr)pb, false);
  68.             if (noErr != osErr) {
  69.                 DisposPtr((Ptr) pb);
  70.                 return osErr;
  71.             }
  72.         } while ((*pb).ioVDRefNum != ioRefNum);
  73.         osErr = PBEject((ParmBlkPtr)pb);
  74.         if (noErr == osErr)
  75.              osErr = PBUnmountVol((ParmBlkPtr)pb);
  76.         DisposPtr((Ptr) pb);
  77.     }
  78.     return osErr;
  79. }
  80.  
  81. pascal    OSErr APlay(short ioRefNum, Byte startTrack, Byte playMode) {
  82.  
  83.     auto    OSErr            osErr;
  84.     static    APlayRec        *pb;    
  85.  
  86.     pb = (APlayRec *) NewPtrClear(sizeof (*pb));
  87.     osErr = MemError();
  88.     if (0 != pb && noErr == osErr) {
  89.         (*pb).ioRefNum             = ioRefNum;
  90.         (*pb).csCode            = csAPlay;
  91.         (*pb).csParam.type        = TRACKADDR;
  92.         (*pb).csParam.addr[3]    = Decimal2BCD(startTrack);
  93.         (*pb).csParam.startStop    = START;
  94.         (*pb).csParam.fill        = 0;
  95.         (*pb).csParam.playMode    = playMode;
  96.         osErr = PBControl((ParmBlkPtr)pb, false);
  97.         DisposPtr((Ptr) pb);
  98.     }
  99.     return osErr;
  100. }
  101.  
  102. pascal    OSErr AStop(short ioRefNum, Byte stopTrack) {
  103.  
  104.     auto    OSErr            osErr;
  105.     static    AStopRec        *pb;    
  106.  
  107.     pb = (AStopRec *) NewPtrClear(sizeof (*pb));
  108.     osErr = MemError();
  109.     if (0 != pb && noErr == osErr) {
  110.         (*pb).ioRefNum             = ioRefNum;
  111.         (*pb).csCode            = csAStop;
  112.         (*pb).csParam.type        = 0 == stopTrack ? BLOCKADDR : TRACKADDR; 
  113.         (*pb).csParam.addr[3]    = Decimal2BCD(stopTrack);
  114.         osErr = PBControl((ParmBlkPtr)pb, false);
  115.         DisposPtr((Ptr) pb);
  116.     }
  117.     return osErr;
  118. }
  119.  
  120. pascal    OSErr APause(short ioRefNum, Long state) { 
  121.  
  122.     auto    OSErr            osErr;
  123.     static    APauseRec        *pb;
  124.  
  125.     pb = (APauseRec *) NewPtrClear(sizeof (*pb));
  126.     osErr = MemError();
  127.     if (0 != pb && noErr == osErr) {
  128.         (*pb).ioRefNum            = ioRefNum;
  129.         (*pb).csCode            = csAPause;
  130.         (*pb).csParam.state        = state;
  131.         osErr = PBControl((ParmBlkPtr)pb, false);
  132.         DisposPtr((Ptr) pb);
  133.     }
  134.     return osErr;
  135. }
  136.  
  137. pascal    OSErr TrackCount(short ioRefNum, Byte *stopTrack) {
  138.  
  139.     auto    OSErr            osErr;
  140.     static    ReadTOCRec        *pb;
  141.  
  142.     pb = (ReadTOCRec *) NewPtrClear(sizeof (*pb));
  143.     osErr = MemError();
  144.     if (0 != pb && noErr == osErr) {
  145.         (*pb).ioRefNum            = ioRefNum;
  146.         (*pb).csCode            = csReadTOC;
  147.         (*pb).csParam.type        = 1;
  148.         osErr = PBControl((ParmBlkPtr)pb, false);
  149.         if (noErr == osErr) {
  150.             *stopTrack            = BCD2Decimal((*pb).csParam.addr[1]);
  151.         }
  152.         DisposPtr((Ptr) pb);
  153.     }
  154.     return osErr;
  155. }
  156.  
  157. pascal    OSErr TrackInfo(short ioRefNum, Byte track, Byte *cntlField, Byte *minutes, Byte *seconds, Byte *frames) {
  158.  
  159.     auto    OSErr            osErr;
  160.     static    ReadTOCRec        *pb;
  161.     
  162.     pb = (ReadTOCRec *) NewPtrClear(sizeof (*pb));
  163.     osErr = MemError();
  164.     if (0 != pb && noErr == osErr) {
  165.         (*pb).ioRefNum                    = ioRefNum;
  166.         (*pb).csCode                    = csReadTOC;
  167.         (*pb).csParam.type                = 3;
  168.         (*pb).csParam.buffer.data        = (Long) NewPtrClear(sizeof (StartAddrRec));
  169.         osErr = MemError();
  170.         if (0 != (*pb).csParam.buffer.data && noErr == osErr) {
  171.             (*pb).csParam.buffer.length        = sizeof(StartAddrRec);
  172.             (*pb).csParam.buffer.track        = Decimal2BCD(track);
  173.             osErr = PBControl((ParmBlkPtr)pb, false);
  174.             if (noErr == osErr) {
  175.                 *cntlField         = (*(StartAddrRec *)(*pb).csParam.buffer.data).cntlField;
  176.                 *minutes         = BCD2Decimal((*(StartAddrRec *)(*pb).csParam.buffer.data).minutes);
  177.                 *seconds        = BCD2Decimal((*(StartAddrRec *)(*pb).csParam.buffer.data).seconds);
  178.                 *frames            = BCD2Decimal((*(StartAddrRec *)(*pb).csParam.buffer.data).frames);
  179.             }
  180.             DisposPtr((Ptr) (*pb).csParam.buffer.data);
  181.         }
  182.         DisposPtr((Ptr) pb);
  183.     }
  184.     return osErr;
  185. }
  186.  
  187. pascal    OSErr ATrkSearch(short ioRefNum, Byte track, Byte playFlag, Byte playMode) {
  188.  
  189.     auto    OSErr            osErr;
  190.     static    ATrkSearchRec    *pb;    
  191.  
  192.     pb = (ATrkSearchRec *) NewPtrClear(sizeof (*pb));
  193.     osErr = MemError();
  194.     if (0 != pb && noErr == osErr) {
  195.         (*pb).ioRefNum             = ioRefNum;
  196.         (*pb).csCode            = csATrkSearch;
  197.         (*pb).csParam.type        = TRACKADDR;
  198.         (*pb).csParam.addr[3]    = Decimal2BCD(track);
  199.         (*pb).csParam.playFlag    = playFlag;
  200.         (*pb).csParam.playMode    = playMode;
  201.         osErr = PBControl((ParmBlkPtr)pb, false);
  202.         DisposPtr((Ptr) pb);
  203.     }
  204.     return osErr;
  205. }
  206.  
  207. pascal    OSErr AStatus(short ioRefNum, Byte *audioStatus, Byte *playMode, Byte *cntlField, Byte *minutes, Byte *seconds, Byte *frames) {
  208.  
  209.     auto    OSErr            osErr;
  210.     static    AStatusRec        *pb;
  211.  
  212.     pb = (AStatusRec *) NewPtrClear(sizeof (*pb));
  213.     osErr = MemError();
  214.     if (0 != pb && noErr == osErr) {
  215.         (*pb).ioRefNum                = ioRefNum;
  216.         (*pb).csCode                = csAStatus;
  217.         osErr = PBControl((ParmBlkPtr)pb, false);
  218.         if (noErr == osErr) {
  219.             *audioStatus        = (*pb).csParam.audioStatus;
  220.             *playMode            = (*pb).csParam.playMode;
  221.             *cntlField            = (*pb).csParam.cntlField;
  222.             *minutes            = BCD2Decimal((*pb).csParam.minutes);
  223.             *seconds            = BCD2Decimal((*pb).csParam.seconds);
  224.             *frames                = BCD2Decimal((*pb).csParam.frames);
  225.         }
  226.         DisposPtr((Ptr) pb);
  227.     }
  228.     return osErr;
  229. }
  230.